Verificar que un dominio tiene bien configurado SPF, DMARC, DNSSEC o MTA-STS suele implicar abrir varias herramientas distintas o hacer consultas DNS a mano. dnsscan lo agrupa todo en un único pase: evalúa los controles de seguridad de la capa DNS de un dominio y devuelve un grade de A+ a F con puntuación numérica de 0 a 100, explicando exactamente qué pasa y por qué.
Qué controles evalúa dnsscan
El escáner de seguridad DNS cubre siete controles modernos de la capa DNS:
- DNSSEC: comprueba la presencia de registros DNSKEY/RRSIG y el flag AD del resolver, reportando si está habilitado y si la validación es correcta.
- CAA: detecta los registros CAA en el apex del dominio, indicando qué autoridades de certificación están autorizadas a emitir.
- SPF: lee el registro TXT
v=spf1y analiza la polÃtica terminal:-all(estricto),~all(softfail),?all(neutral) o+all(peligrosamente permisivo). - DMARC: consulta el TXT en
_dmarc.dominioy reporta la polÃtica (none,quarantineoreject) con el registro completo. - MTA-STS: si el TXT
_mta-stsestá presente, descarga y parsea el fichero de polÃtica enhttps://mta-sts.dominio/.well-known/mta-sts.txtcon certificado validado, timeout de 5 s y un guard anti-SSRF que rechaza redirecciones fuera del dominio. Reporta modo,max_agey la lista de MX autorizados. - TLS-RPT: detecta el TXT en
_smtp._tls.dominiopara informes de fallos de entrega cifrada. - DKIM: solo informativo (requiere un selector explÃcito para comprobarse).
El resultado en JSON
El contrato de salida es un struct JSON estable —los campos nunca se renombran ni eliminan, solo se añaden— que incluye grade, score, el detalle de cada control y un array de findings con status pass/warn/fail/info y severity info/low/medium/high. Ejemplo resumido para un dominio bien configurado:
{"domain":"cloudflare.com","grade":"A","score":85,
"spf":{"present":true,"policy":"-all"},
"dmarc":{"present":true,"policy":"reject"},
"dnssec":{"enabled":true,"valid":true}}
Tres formas de usarlo
Como librerÃa Go: dnsscan.Scan(ctx, dnsscan.Options{Domain: "ejemplo.com"}) devuelve el Result completo. Una única dependencia externa: github.com/miekg/dns (BSD-3-Clause, comercialmente compatible).
Como CLI: dnsscan ejemplo.com para salida legible o dnsscan -json -resolver 1.1.1.1 ejemplo.com para JSON con resolver explÃcito. El timeout total es configurable (-timeout 10s).
Como servicio HTTP: headerforge-dns escucha en 127.0.0.1:8082 por defecto y acepta POST /v1/scan con JSON body. Misma arquitectura que su proyecto hermano tlsscan: pensado para comunicación interna o reverse proxy, no para exposición directa a internet.
Licencia y uso en productos comerciales
El proyecto tiene licencia MIT. Es el motor DNS de HeaderForge, pero se publica de forma independiente para que cualquiera pueda embeber el análisis de postura de seguridad DNS en sus propios productos sin fricción de licencia. Requiere Go 1.22+ y está disponible en GitHub con un Dockerfile incluido para despliegue containerizado.
